package basic

import "fmt"
/**
 引用传递，它的底层其实是维护了一个数组
 */
func Slices()  {

	arr1 := [...]int{
		1,2,3,4,5,6,7,8,9,
	}

	// 它底层还是维护的那个arr1的数据，只是指针向前移动了2位 虽然长度是1但是可以向后拓展到cap的上限。
	// [:] [1:] [:2] [1:2]
	// 切片是对array的视图
	arr2 := arr1[2:3]

	fmt.Println(arr2,cap(arr2), len(arr2)) // _ 7 1

	arr3 := arr2[:5]

	fmt.Println(arr3, len(arr3), cap(arr3)) // 3,4,5,6,7 5 7

	//动 [f:]  动f 会移动指针影响cap 以及 [:m] m的取值  如果越界会报错
	// 不管你切片几次底层维护的都是 arr1
	// 每次slice都会创建新的视图空间 底层维护着起初的那个数组

	// 指针只能向后不能向前走位
	// arr3[len] 不能超过len
	// [:n] n不能超过cap
	// 越界报错

	//slice添加
	// 所谓的添加就是在视图上搞不会影响到原来的底层数组。每次添加都会生成一份新的视图 append 每次都会创建一个新的数组维护新的视图 但是如果cap够还不会分配只有不够才会分配新数组。原来的就会考过去
	ding := [...]int{
		1,2,3,4,5,
	}
	dings := ding[:]
	tig := [...]int{
		1,2,3,4,5,
	}
	dings2 := append(dings, tig[:]...)

	fmt.Println(dings2)

	// 注意append 之后底层维护的就是一个新的array 新的视图  只有cap不够才会创建新的数组 原来的就会考过去


	// make // cap 如果预估涨的会很快上来就多开点
	as := make([]int, 16, 16)
	fmt.Println(as)

	// copy 只能复制切片
	copy(as, dings2)
	fmt.Println(as)

	// delete
	delzeroAys := as[1:]
	fmt.Println(delzeroAys)
	// 删除下标为3的
	fmt.Println(append(as[:4], as[5:]...))
}
